#include "includes.h"
#include "keyboard.h"
#include <stm32f4xx.h>
#include "sys.h"
#include "delay.h"


void keyboard_init(void)
{
	GPIO_InitTypeDef	GPIO_InitStructure;
	
	
	 //使能端口D的硬件时钟，就是对端口D供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    
    //使能端口E的硬件时钟，就是对端口E供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);


   	//PD9 PE15 PE13 PE11   //PE9  PE7 PD0 PD14 
	//使用GPIO_Init来配置引脚
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;        //输出模式
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;       //推挽输出模式,默认的
	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15; //指定第11 13 15根引脚  C4 C3 C2
	GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed;     //高速，但是功耗是最高
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;  //无需上下拉（亦可使能下拉电阻）
	GPIO_Init(GPIOE,&GPIO_InitStructure);              //E口
	
	 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; 			//指定第9根引脚 C1
    GPIO_Init(GPIOD,&GPIO_InitStructure);               //D口
    
	/* 矩阵键盘输入模式必须使能内部上拉电阻，引脚悬空的时候为固定的高电平 */
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;	   //上拉
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;         //输入模式
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_7;               //指定第9、7根引脚	   R1 R2
    GPIO_Init(GPIOE,&GPIO_InitStructure);              				 //E口

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_14;              //指定第0、14根引脚 	R3 R4
    GPIO_Init(GPIOD,&GPIO_InitStructure);             				 //D口

  
}


char get_key_board(void)
{
    PDout(9) = 0;
    PEout(15) = 1;
    PEout(12) = 1;
    PEout(11) = 1;
    delay_ms(2);
	

    if( PEin(9) == 0 ) return 'A';
    else if( PEin(7) == 0 ) return 'B';
    else if( PDin(0) == 0 ) return 'C';
    else if( PDin(14) == 0 ) return 'D';
    
    PDout(9) = 1;
    PEout(15) = 0; 
    PEout(12) = 1; 
    PEout(11) = 1;
    delay_ms(2);


    if( PEin(9) == 0 ) return '3'; 
    else if( PEin(7) == 0 ) return '6';
    else if( PDin(0) == 0 ) return '9'; 
    else if( PDin(14) == 0 ) return '#';
    
    PDout(9) = 1;
    PEout(15) = 1; 
    PEout(12) = 0; 
    PEout(11) = 1;
    delay_ms(2);

    if( PEin(9) == 0 ) return '2'; 
    else if( PEin(7) == 0 ) return '5'; 
    else if( PDin(0) == 0 ) return '8'; 
    else if( PDin(14) == 0 ) return '0';
    
    PDout(9) = 1;
    PEout(15) = 1; 
    PEout(12) = 1; 
    PEout(11) = 0;
    delay_ms(2);

    if( PEin(9) == 0 ) return '1'; 
    else if( PEin(7) == 0 ) return '4'; 
    else if( PDin(0) == 0 ) return '7'; 
    else if( PDin(14) == 0 ) return '*';
    
    return 'N';
}

